package Juego.vista;

import Juego.parametros;
import Juego.modelo.Terreno.Terreno;
import Juego.modelo.Terreno.Agua.Agua;
import Juego.modelo.Terreno.Tierra.Tierra;

public class MVCMapa {
	parametros param = new parametros();
	public int X ;
	public int Y ;
	public int Z = 3;
	public Object mapa[][][] ;

	public void initMapa(String[] strings) {
		
		X = strings.length;
		Y = strings[ 0 ].length();
		System.out.println( X + " " + Y );
		mapa = new Object[X][Y+1][Z];
		for (int i = 0; i < X; i++) {
			for (int j = 0; j < Y; j++) {
				if( strings[ i ].charAt( j ) == '@')
					mapa[ i ][ j ][ 0 ] = new Agua( );				
				else
					mapa[ i ][ j ][ 0 ] = new Tierra();
				for (int k = 1; k < Z; k++) {
					mapa[i][j][k] = null;
				}
			}
		}
	}
	
	public Object getPos( int i , int j , int k ){ return mapa[ i ][ j ][ k ];}

	public void imprimeMapa() {
		for (int i = 0; i < X; i++) {
			for (int j = 0; j < Y; j++) {
				if (mapa[i][j][2] == null  && mapa[i][j][1] == null ) {
					//Terreno T = ( Terreno ) mapa[ i ][ j ][ 0 ];
					dibujable A = (dibujable) mapa[ i ][ j ][ 0 ];
					A.dibujar();					
					
				} else if (mapa[i][j][1] != null) {
					//SuperEdificio A = ( SuperEdificio )mapa[ i ][ j ][ 1 ];
					dibujable A = (dibujable) mapa[ i ][ j ][ 1 ];
					A.dibujar();
				}
				else{
					//System.out.print( '2' );
					//SuperUnidad A = ( SuperUnidad ) mapa[ i ][ j ][ 2 ];
					dibujable A = (dibujable) mapa[ i ][ j ][ 12];
					A.dibujar();
					//System.out.print( A.getSimbolo() );
				}
			}
			System.out.println();
		}
	}

	public boolean in(int x, int xlar, int y, int ylar) {
		return (x >= 0 && y >= 0 && xlar < X && ylar < Y);
	}

	public boolean ocupado( int i , int j ){
		Terreno T = ( Terreno )mapa[ i ][ j ][ 0 ];
		return mapa[ i ][ j ][ 1 ] != null || mapa[ i ][ j ][ 2 ] != null || T instanceof Agua; 
	}
	
	public boolean esPosibleConstruir(int x, int y, int largo, int ancho) {
		boolean res = true;
		if (!in(x, x + largo - 1, y, y + ancho - 1))
			return false;
		for (int i = x; i < x + largo; i++) {
			for (int j = y; j < y + ancho; j++) {
				if( ocupado( i , j ) ){ res = false; break ; }
			}
			if (!res)
				break;
		}
		return res;
	}

	public boolean construirEdificio(int x, int y , int z , int largo, int ancho, Object O ) {
		if (esPosibleConstruir(x, y, largo, ancho) == true) {
			for (int i = x; i < x + largo; i++)
				for (int j = y; j < y + ancho; j++)
					mapa[ i ][ j ][ z ] = O;
			return true;
		}
		return false;
	}
}